package org.aliwo.syn;


/**
 * @author xuyayuan
 * @data 2021年06月19日
 * 作业，
 * 有两个用户分别从一个卡中取钱(10000)
 * 每次都取1000，当余额不足时，不能取款
 * 不能出现超取的现象
 */
public class HomeWork02 {
    public static void main(String[] args) {
        T t = new T();
        Thread thread01 = new Thread(t);
        Thread thread02 = new Thread(t);
        thread01.setName("t1");
        thread02.setName("t2");
        thread01.start();
        thread02.start();

    }
}

class T implements Runnable {
    private int money = 10000;
    private volatile int count = 0;

    @Override
    public void run() {

        while (true) {

            // 使用synchronized实现了线程的同步
            // 当多个线程执行到这里的时候，就会去争夺this对象锁
            // 哪个线程获取this对象锁，就会执行synchronized 代码块，执行完后，会释放this对象锁
            // 争夺不到this对象锁，就blocked，准备继续争夺
            // this对象锁是非公平锁
            synchronized (this) {  // 同步代码块
                if (1000 > money) {
                    System.out.println("余额不足。。。。，不能取款");
                    break;
                }
                money -= 1000;
                System.out.println(Thread.currentThread().getName() + "取款了 1000元" + "第" + (++count) + "次取款。" + " 剩余 :" +
                        " " + money);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
